package BeheerFysiotherapeuten.Model;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Observable;

public class PraktijkLijst extends Observable implements Serializable {
    private Praktijk praktijk;
    private ArrayList<Praktijk> praktijken;

    public PraktijkLijst() {
        praktijken = new ArrayList<Praktijk>();
    }

    public void newPraktijk(String naam, String adres, String postcode,
                            String telNr, int Kamers,
                            ArrayList<Therapeut> therapeutLijst,
                            ArrayList<Kamer> kamerLijst) {
        praktijk = new Praktijk(naam, adres, postcode, telNr, Kamers);
        praktijk.settherapeuten(therapeutLijst);
        praktijk.setKamerLijst(kamerLijst);
        praktijken.add(praktijk);

        setChanged();
        notifyObservers();
    }

    public void newPraktijk(String naam, String adres, String postcode,
                            String telNr, int Kamers) {
        praktijk = new Praktijk(naam, adres, postcode, telNr, Kamers);
        praktijken.add(praktijk);

        setChanged();
        notifyObservers();
    }

    public ArrayList<Praktijk> getPraktijken() {
        return praktijken;
    }

    public int lengtePraktijken() {
        return praktijken.size();
    }

    public void wijzigPraktijk(String naam, String adres, String postcode,
                               String telNr, int Kamers,
                               int selectedPraktijk) {
        Praktijk wijzig = praktijken.get(selectedPraktijk);
        wijzig.setNaam(naam);
        wijzig.setAdres(adres);
        wijzig.setPostcode(postcode);
        wijzig.setTelNr(telNr);
        wijzig.setkamers(Kamers);
        setChanged();
        notifyObservers();
    }

    public void verwijderPraktijk(int praktijk) {
        praktijken.remove(praktijk);

        setChanged();
        notifyObservers();
    }

    public void verwijderTherapeut(String praktijknaam, String bsn) {

        for (int i = 0; i < praktijken.size(); i++) {
            if (praktijken.get(i).getNaam().equals(praktijknaam)) {

                praktijken.get(i).verwijderTherapeut(bsn);
            }
        }
        setChanged();
        notifyObservers();
    }

    public Therapeut maakTherapeut(String voornaamField, String tussenvoegselField,
                              String achternaamField, int bsn,
                              String woonplaatsField, String geslachtField,
                              String geb, String adresField,
                              String postcodeField, String tel, String start,
                              int uren, int praktijk) {

        Therapeut t = praktijken.get(praktijk).newTherapeut(voornaamField,
                                              tussenvoegselField,
                                              achternaamField, bsn,
                                              woonplaatsField, geslachtField,
                                              geb, adresField, postcodeField,
                                              tel, start, uren);

        setChanged();
        notifyObservers();
        return t;
    }

    public void wijzigTherapeut(String voorNaam, String tussenVoegsel,
                                String achterNaam, int bsn, String woonplaats,
                                String geslacht, String gebDatum, String adres,
                                String postcode, String telNr,
                                String startDatum, String bsnoud,
                                String praktijkoud, String praktijk) {

        for (int i = 0; i < praktijken.size(); i++) {
            if (praktijken.get(i).getNaam().equals(praktijkoud)) {
                praktijken.get(i).wijzigTherapeut(voorNaam, tussenVoegsel,
                                                  achterNaam, bsn, woonplaats,
                                                  geslacht, gebDatum, adres,
                                                  postcode, telNr, startDatum,
                                                  bsnoud);
                String[] nieuw = praktijk.split("-");
                if (praktijkoud != praktijk) {

                    for (int y = 0; y < praktijken.size(); y++) {
                        if (praktijken.get(y).getNaam().equals(praktijkoud)) {

                            for (int x = 0;
                                 x < praktijken.get(y).getTherapeuten().size();
                                 x++) {
                                if (praktijken.get(y).getTherapeuten().get(x).getBsnint() ==
                                    bsn) {

                                    for (int z = 0; z < praktijken.size();
                                         z++) {
                                        if (praktijken.get(z).getNaam().equals(nieuw[0])) {

                                            praktijken.get(z).getTherapeuten().add(praktijken.get(y).getTherapeuten().get(x));
                                        }
                                    }
                                    praktijken.get(y).getTherapeuten().remove(x);
                                }
                            }
                        }
                    }
                }
            }
        }
        setChanged();
        notifyObservers();
    }

    public void nieuwTherapie(String naam, String soort, int duur,
                              String doelgroep, double prijs,
                              String omschijving, String behandelcode,
                              String therapeutnaam, String bsn) {


        for (int x = 0; x < praktijken.size(); x++)
            for (int y = 0; y < praktijken.get(x).getTherapeuten().size();
                 y++) {
                if (praktijken.get(x).getTherapeuten().get(y).getVoorNaam().equals(therapeutnaam) &&
                    praktijken.get(x).getTherapeuten().get(y).getBsn().equals(bsn)) {
                    praktijken.get(x).getTherapeuten().get(y).nieuwTherapie(naam,
                                                                            soort,
                                                                            duur,
                                                                            doelgroep,
                                                                            prijs,
                                                                            omschijving,
                                                                            behandelcode);
                }
            }
        setChanged();
        notifyObservers();
    }

    public void wijzigTherapie(String naamfield, String soortfield, int duur,
                               String doelgroepfield, double prijs,
                               String omschrijvingfield, String behandelcode,
                               String behandelcodeoud, String therapeutbsn,
                               String therapeutbsnoud) {
        boolean stop = true;

        for (int x = 0; x < praktijken.size(); x++) {
            for (int y = 0; y < praktijken.get(x).getTherapeuten().size();
                 y++) {
                if (praktijken.get(x).getTherapeuten().get(y).getBsn().equals(therapeutbsnoud)) {
                    for (int z = 0;
                         z < praktijken.get(x).getTherapeuten().get(y).getTherapieen().size();
                         z++) {
                        if (praktijken.get(x).getTherapeuten().get(y).getTherapieen().get(z).getBehandelcode().equals(behandelcodeoud)) {
                            praktijken.get(x).getTherapeuten().get(y).wijzigTherapie(naamfield,
                                                                                     soortfield,
                                                                                     duur,
                                                                                     doelgroepfield,
                                                                                     prijs,
                                                                                     omschrijvingfield,
                                                                                     behandelcode,
                                                                                     behandelcodeoud);

                            if (therapeutbsn.equals(therapeutbsnoud) ==
                                false) {
                                if (stop) {
                                    for (int a = 0; a < praktijken.size();
                                         a++) {
                                        for (int b = 0;
                                             b < praktijken.get(a).getTherapeuten().size();
                                             b++) {

                                            if (praktijken.get(a).getTherapeuten().get(b).getBsn().equals(therapeutbsn)) {
                                                praktijken.get(a).getTherapeuten().get(b).getTherapieen().add(praktijken.get(x).getTherapeuten().get(y).getTherapieen().get(z));
                                                stop = false;
                                            }


                                        }
                                    }
                                    praktijken.get(x).getTherapeuten().get(y).getTherapieen().remove(z);
                                }
                            }
                        }
                    }
                }
            }
        }
        setChanged();
        notifyObservers();

    }

    public void verwijderTherapie(String therapeutbsn, String behandelcode) {

        for (int x = 0; x < praktijken.size(); x++) {
            for (int y = 0; y < praktijken.get(x).getTherapeuten().size();
                 y++) {
                if (praktijken.get(x).getTherapeuten().get(y).getBsn().equals(therapeutbsn)) {
                    for (int z = 0;
                         z < praktijken.get(x).getTherapeuten().get(y).getTherapieen().size();
                         z++) {
                        if (praktijken.get(x).getTherapeuten().get(y).getTherapieen().get(z).getBehandelcode().equals(behandelcode)) {
                            praktijken.get(x).getTherapeuten().get(y).getTherapieen().remove(z);
                        }
                    }
                }
            }
            setChanged();
            notifyObservers();
        }
    }
}
